CloudFormationにあるパラメータのDefaultは最初の1回しか使われないため、値の変更時は注意しよう
CloudFormationのパラメータって便利ですよね。環境名を定義したり、DynamoDBテーブル名を定義したりです。
そんなパラメータに設定できるDefault
ですが、これは最初の1回しか参照されません。
そのため、値を変更する場合はDefault
の値を変更してもダメです。
やってみる
次のCloudFormationテンプレートがあるとします。SNSトピックを1つ作成しており、トピック名に環境名のdev
を付与しています。
AWSTemplateFormatVersion: "2010-09-09" Description: Sample Stack Parameters: Env: Type: String Default: dev Resources: FooBarSNSTopic: Type: AWS::SNS::Topic Properties: TopicName: !Sub foo-bar-sns-topic-${Env}
1. まずは普通にデプロイする
実際にデプロイしてみます。
aws cloudformation deploy \ --template-file sample.yaml \ --stack-name foo-bar-sample-stack \ --no-fail-on-empty-changeset
CloudFormationのパラメータはDefault
のdev
が反映されています。
SNSトピックもバッチリと作成されています。
2. Defaultの値を変更してデプロイする
開発環境の名前(dev
)をコードネームのorange
に変更することになったとします。
それに伴って、CloudFormationのパラメータのDefault
の値を変更します。
AWSTemplateFormatVersion: "2010-09-09" Description: Sample Stack Parameters: Env: Type: String Default: orange Resources: FooBarSNSTopic: Type: AWS::SNS::Topic Properties: TopicName: !Sub foo-bar-sns-topic-${Env}
この状態でデプロイします。
aws cloudformation deploy \ --template-file sample.yaml \ --stack-name foo-bar-sample-stack \ --no-fail-on-empty-changeset
コマンド実行すると、「変更するものが無いからデプロイしないよ」と言われました。
Waiting for changeset to be created.. No changes to deploy. Stack foo-bar-sample-stack is up to date
3. パラメータを上書きしてデプロイする
Default
が反映されないことを確認するために、CloudFormationテンプレートのパラメータにある環境名をdev
に戻します。
AWSTemplateFormatVersion: "2010-09-09" Description: Sample Stack Parameters: Env: Type: String Default: dev Resources: FooBarSNSTopic: Type: AWS::SNS::Topic Properties: TopicName: !Sub foo-bar-sns-topic-${Env}
このファイルをデプロイします。このとき、新しい環境名のorange
をコマンド実行時に指定します。
aws cloudformation deploy \ --template-file sample.yaml \ --stack-name foo-bar-sample-stack \ --no-fail-on-empty-changeset \ --parameter-overrides Env=orange
今度は成功しました。
Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - foo-bar-sample-stack
CloudFormationを確認すると、バッチリと変更されています。
SNSトピック名も変更されています。
さいごに
CloudFormationのパラメータの値をあとから変更する事は少ないかもしれませんが、Default
を使っている場合は注意が必要です。
そもそも、Default
は「1回目にパラメータが未指定なら使う値」という動作です。
「パラメータが未指定ならダメ」を望むなら、Default
は使わない方が良いですね。